package jfloat;

public class Accurate {


    public static void main(String[] args) {
        float f2 = 11.9f;
        //整数部分除二取余,小数部分乘2取整数，
        //整数：11/2=5余1  5/2=2余1  2/2=1余0  1/2=0余1 . 11二进制表示为(从下往上):1011
        /*
         * 小数：
         * 0.9*2=1.8   取整数部分 1
         * 0.8*2=1.6   取整数部分 1
         * 0.6*2=1.2   取整数部分 1
         * 0.2*2=0.4   取整数部分 0
         * 0.4*2=0.8   取整数部分 0
         * 0.8*2=1.6   取整数部分 1
         * 0.6*2=1.2   取整数部分 0
         * .........   进入循环
         * 0.9二进制表示为(从上往下): 1100100100100
         */
        //(1) 将11.9化为二进制后大约是" 1011.1110011001100110011001100..."。
        /* iee754 规范(科学计数法)
        (2) 将小数点左移三位到第一个有效位右侧： "1.01111100110011001100110 "。 保证有效位数24位，右侧多余的截取（误差在这里产生了 ）。
        (3) 这已经有了二十四位有效数字，将最左边一位“1”去掉，得到“ 01111100110011001100110 ”共23bit。
        (4) 因为11.9是正数，因此在第31位实数符号位放入“0”。
        (5) 因为我们是把小数点左移3位 所以 3+127 = 10000010
        最后表示11.9为： 0 10000010 01111100110011001100110
        */
        jdkFloatString(f2);
    }

    public static void jdkFloatString(float f2) {
        String floatBitString = Integer.toBinaryString(Float.floatToIntBits(f2));
        //正数0会被舍掉
        floatBitString = completion(floatBitString);
        System.out.println(floatBitString);
        String sign = floatBitString.substring(0, 1);
        //阶码
        String exponent = floatBitString.substring(1, 9);
        //尾数
        String mantissa = floatBitString.substring(9);
        System.out.println(String.format("sign=%s, exponent = %s , mantissa = %s", sign, exponent, mantissa));
    }


    private static String completion(String s) {
        for (int i = 32 - s.length(); i > 0; i--) {
            s = "0" + s;
        }
        return s;
    }

}
